home *** CD-ROM | disk | FTP | other *** search
/ OpenGL Superbible (2nd Edition) / OpenGL SuperBible e2.iso / tools / GLUT-3.7 / PROGS / EXAMPLES / FOGTST.C < prev    next >
Encoding:
C/C++ Source or Header  |  1998-08-12  |  7.2 KB  |  262 lines

  1.  
  2. /* Copyright (c) Mark J. Kilgard, 1994. */
  3.  
  4. /**
  5.  * (c) Copyright 1993, Silicon Graphics, Inc.
  6.  * ALL RIGHTS RESERVED 
  7.  * Permission to use, copy, modify, and distribute this software for 
  8.  * any purpose and without fee is hereby granted, provided that the above
  9.  * copyright notice appear in all copies and that both the copyright notice
  10.  * and this permission notice appear in supporting documentation, and that 
  11.  * the name of Silicon Graphics, Inc. not be used in advertising
  12.  * or publicity pertaining to distribution of the software without specific,
  13.  * written prior permission. 
  14.  *
  15.  * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
  16.  * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
  17.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
  18.  * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
  19.  * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
  20.  * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
  21.  * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
  22.  * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
  23.  * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
  24.  * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
  25.  * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
  26.  * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
  27.  * 
  28.  * US Government Users Restricted Rights 
  29.  * Use, duplication, or disclosure by the Government is subject to
  30.  * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
  31.  * (c)(1)(ii) of the Rights in Technical Data and Computer Software
  32.  * clause at DFARS 252.227-7013 and/or in similar or successor
  33.  * clauses in the FAR or the DOD or NASA FAR Supplement.
  34.  * Unpublished-- rights reserved under the copyright laws of the
  35.  * United States.  Contractor/manufacturer is Silicon Graphics,
  36.  * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
  37.  *
  38.  * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
  39.  */
  40.  
  41. #include <stdio.h>
  42. #include <string.h>
  43. #include <stdlib.h>
  44. #include <GL/glut.h>
  45.  
  46. GLenum doubleBuffer;
  47. double plane[4] = {
  48.   1.0, 0.0, -1.0, 0.0
  49. };
  50. float rotX = 5.0, rotY = -5.0, zTranslate = -65.0;
  51. float fogDensity = 0.02;
  52. GLint cubeList = 1;
  53.  
  54. float scp[18][3] = {
  55.   {1.000000, 0.000000, 0.000000},
  56.   {1.000000, 0.000000, 5.000000},
  57.   {0.707107, 0.707107, 0.000000},
  58.   {0.707107, 0.707107, 5.000000},
  59.   {0.000000, 1.000000, 0.000000},
  60.   {0.000000, 1.000000, 5.000000},
  61.   {-0.707107, 0.707107, 0.000000},
  62.   {-0.707107, 0.707107, 5.000000},
  63.   {-1.000000, 0.000000, 0.000000},
  64.   {-1.000000, 0.000000, 5.000000},
  65.   {-0.707107, -0.707107, 0.000000},
  66.   {-0.707107, -0.707107, 5.000000},
  67.   {0.000000, -1.000000, 0.000000},
  68.   {0.000000, -1.000000, 5.000000},
  69.   {0.707107, -0.707107, 0.000000},
  70.   {0.707107, -0.707107, 5.000000},
  71.   {1.000000, 0.000000, 0.000000},
  72.   {1.000000, 0.000000, 5.000000},
  73. };
  74.  
  75. static float ambient[] = {0.1, 0.1, 0.1, 1.0};
  76. static float diffuse[] = {1.0, 1.0, 1.0, 1.0};
  77. static float position[] = {90.0, 90.0, 0.0, 0.0};
  78. static float front_mat_shininess[] = {30.0};
  79. static float front_mat_specular[] = {0.0, 0.0, 0.0, 1.0};
  80. static float front_mat_diffuse[] = {0.0, 1.0, 0.0, 1.0};
  81. static float back_mat_shininess[] = {50.0};
  82. static float back_mat_specular[] = {0.0, 0.0, 1.0, 1.0};
  83. static float back_mat_diffuse[] = {1.0, 0.0, 0.0, 1.0};
  84. static float lmodel_ambient[] = {0.0, 0.0, 0.0, 1.0};
  85. static float fog_color[] = {0.8, 0.8, 0.8, 1.0};
  86.  
  87. /* ARGSUSED1 */
  88. static void
  89.   Key(unsigned char key, int x, int y)
  90. {
  91.   switch (key) {
  92.   case 'd':
  93.     fogDensity *= 1.10;
  94.     glFogf(GL_FOG_DENSITY, fogDensity);
  95.     glutPostRedisplay();
  96.     break;
  97.   case 'D':
  98.     fogDensity /= 1.10;
  99.     glFogf(GL_FOG_DENSITY, fogDensity);
  100.     glutPostRedisplay();
  101.     break;
  102.   case 27:
  103.     exit(0);
  104.   }
  105. }
  106.  
  107. /* ARGSUSED1 */
  108. static void
  109.   SpecialKey(int key, int x, int y)
  110. {
  111.   switch (key) {
  112.   case GLUT_KEY_UP:
  113.     rotX -= 5;
  114.     glutPostRedisplay();
  115.     break;
  116.   case GLUT_KEY_DOWN:
  117.     rotX += 5;
  118.     glutPostRedisplay();
  119.     break;
  120.   case GLUT_KEY_LEFT:
  121.     rotY -= 5;
  122.     glutPostRedisplay();
  123.     break;
  124.   case GLUT_KEY_RIGHT:
  125.     rotY += 5;
  126.     glutPostRedisplay();
  127.     break;
  128.   }
  129. }
  130.  
  131. static void
  132.   Draw(void)
  133. {
  134.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  135.  
  136.   glPushMatrix();
  137.  
  138.   glTranslatef(0, 0, zTranslate);
  139.   /* XXX hooky dual axis rotation! */
  140.   glRotatef(rotY, 0, 1, 0);
  141.   glRotatef(rotX, 1, 0, 0);
  142.   glScalef(1.0, 1.0, 10.0);
  143.  
  144.   glCallList(cubeList);
  145.  
  146.   glPopMatrix();
  147.  
  148.   if (doubleBuffer) {
  149.     glutSwapBuffers();
  150.   } else {
  151.     glFlush();
  152.   }
  153. }
  154.  
  155. static void
  156.   Args(int argc, char **argv)
  157. {
  158.   GLint i;
  159.   doubleBuffer = GL_TRUE;
  160.  
  161.   for (i = 1; i < argc; i++) {
  162.     if (strcmp(argv[i], "-sb") == 0) {
  163.       doubleBuffer = GL_FALSE;
  164.     } else if (strcmp(argv[i], "-db") == 0) {
  165.       doubleBuffer = GL_TRUE;
  166.     }
  167.   }
  168. }
  169.  
  170. int
  171.   main(int argc, char **argv)
  172. {
  173.   GLenum type;
  174.  
  175.   glutInit(&argc, argv);
  176.   Args(argc, argv);
  177.  
  178.   type = GLUT_RGB | GLUT_DEPTH;
  179.   type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
  180.   glutInitDisplayMode(type);
  181.   glutInitWindowSize(300, 300);
  182.   glutCreateWindow("Fog Test");
  183.  
  184.   glFrontFace(GL_CW);
  185.  
  186.   glEnable(GL_DEPTH_TEST);
  187.  
  188.   glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
  189.   glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
  190.   glLightfv(GL_LIGHT0, GL_POSITION, position);
  191.   glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
  192.   glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
  193.   glEnable(GL_LIGHTING);
  194.   glEnable(GL_LIGHT0);
  195.  
  196.   glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
  197.   glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
  198.   glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
  199.   glMaterialfv(GL_BACK, GL_SHININESS, back_mat_shininess);
  200.   glMaterialfv(GL_BACK, GL_SPECULAR, back_mat_specular);
  201.   glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
  202.  
  203.   glEnable(GL_FOG);
  204.   glFogi(GL_FOG_MODE, GL_EXP);
  205.   glFogf(GL_FOG_DENSITY, fogDensity);
  206.   glFogfv(GL_FOG_COLOR, fog_color);
  207.   glClearColor(0.8, 0.8, 0.8, 1.0);
  208.   /* *INDENT-OFF* */
  209.   glNewList(cubeList, GL_COMPILE);
  210.     glBegin(GL_TRIANGLE_STRIP);
  211.       glNormal3fv(scp[0]);
  212.       glVertex3fv(scp[0]);
  213.       glNormal3fv(scp[0]);
  214.       glVertex3fv(scp[1]);
  215.       glNormal3fv(scp[2]);
  216.       glVertex3fv(scp[2]);
  217.       glNormal3fv(scp[2]);
  218.       glVertex3fv(scp[3]);
  219.       glNormal3fv(scp[4]);
  220.       glVertex3fv(scp[4]);
  221.       glNormal3fv(scp[4]);
  222.       glVertex3fv(scp[5]);
  223.       glNormal3fv(scp[6]);
  224.       glVertex3fv(scp[6]);
  225.       glNormal3fv(scp[6]);
  226.       glVertex3fv(scp[7]);
  227.       glNormal3fv(scp[8]);
  228.       glVertex3fv(scp[8]);
  229.       glNormal3fv(scp[8]);
  230.       glVertex3fv(scp[9]);
  231.       glNormal3fv(scp[10]);
  232.       glVertex3fv(scp[10]);
  233.       glNormal3fv(scp[10]);
  234.       glVertex3fv(scp[11]);
  235.       glNormal3fv(scp[12]);
  236.       glVertex3fv(scp[12]);
  237.       glNormal3fv(scp[12]);
  238.       glVertex3fv(scp[13]);
  239.       glNormal3fv(scp[14]);
  240.       glVertex3fv(scp[14]);
  241.       glNormal3fv(scp[14]);
  242.       glVertex3fv(scp[15]);
  243.       glNormal3fv(scp[16]);
  244.       glVertex3fv(scp[16]);
  245.       glNormal3fv(scp[16]);
  246.       glVertex3fv(scp[17]);
  247.     glEnd();
  248.   glEndList();
  249.   /* *INDENT-ON* */
  250.  
  251.   glMatrixMode(GL_PROJECTION);
  252.   glLoadIdentity();
  253.   gluPerspective(45.0, 1.0, 1.0, 200.0);
  254.   glMatrixMode(GL_MODELVIEW);
  255.  
  256.   glutKeyboardFunc(Key);
  257.   glutSpecialFunc(SpecialKey);
  258.   glutDisplayFunc(Draw);
  259.   glutMainLoop();
  260.   return 0;             /* ANSI C requires main to return int. */
  261. }
  262.